拆分的核心价值
微服务的关键就是学会服务的拆分。"天下之事,分久必合,合久必分"。拆分的直接好处是:当需要更新某个部分时,只需修改对应的服务代码,打包成镜像,部署上线,暴露接口供其他服务调用即可。整个过程不需要停止其他服务,实现了真正的独立部署和独立迭代。
拆分前的分析
以一个知识付费系统(messages-starter)为例,在拆分前需要分析现有系统中有哪些功能模块,以及它们之间的依赖关系。
现有功能模块梳理
| 模块 | 功能 | 依赖 |
|---|---|---|
| 用户认证 | 注册、登录、Token 管理 | 数据库 |
| 内容管理 | 课程、文章 CRUD | 数据库、文件存储 |
| 订单管理 | 支付、退款、订单查询 | 数据库、支付接口 |
| 消息通知 | 站内信、邮件通知 | 消息队列 |
拆分原则
- 按业务边界拆分 -- 每个微服务对应一个独立的业务领域
- 独立数据库 -- 每个微服务拥有自己的数据库,避免跨服务直接访问数据
- 通过 API 通信 -- 服务间通过 gRPC 或 RESTful API 交互
- 可独立部署 -- 每个服务可以独立构建、测试和部署
拆分后的服务架构
┌──────────────┐
│ Gateway │ ← API 网关(统一入口)
│ Service │
└──────┬───────┘
│
┌────────────┼────────────┐
│ │ │
┌───────▼──┐ ┌──────▼───┐ ┌─────▼────┐
│ User │ │ Order │ │ Content │
│ Service │ │ Service │ │ Service │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
┌────▼─────┐ ┌───▼──────┐ ┌───▼──────┐
│ User DB │ │ Order DB │ │Content DB│
└──────────┘ └──────────┘ └──────────┘
text
拆分的优先级
建议从最基础、最独立的服务开始拆分:
- 用户服务(User Service) -- 最基础,其他服务都依赖用户认证
- 网关服务(Gateway Service) -- 统一入口,转发请求到各个微服务
- 内容服务(Content Service) -- 独立性较强
- 订单服务(Order Service) -- 涉及支付,可以最后拆分
拆分时的注意事项
| 注意事项 | 说明 |
|---|---|
| 数据库分离 | 每个服务有自己的数据库,不能跨服务直接查询 |
| API 版本管理 | 服务的 API 需要有版本号,避免破坏性更新 |
| 配置管理 | 每个服务有独立的配置文件 |
| 日志和监控 | 统一的日志格式和监控标准 |
| 渐进式拆分 | 不要一次性全部拆完,先拆最关键的模块 |
↑